package controles.interfaz;

import java.awt.Dimension;
import java.util.Vector;

import javax.swing.ScrollPaneLayout;

import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.GC;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.graphics.Rectangle;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Canvas;
import org.eclipse.swt.widgets.Combo;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Listener;
import org.eclipse.swt.widgets.ScrollBar;
import org.eclipse.swt.widgets.Text;
import org.eclipse.swt.widgets.TreeItem;
import org.eclipse.ui.IEditorInput;
import org.eclipse.ui.IEditorSite;
import org.eclipse.ui.IPartListener;
import org.eclipse.ui.IWorkbenchPart;
import org.eclipse.ui.PartInitException;
import org.eclipse.ui.part.EditorPart;

import taladro.instrucciones.InstMover;
import taladro.instrucciones.Instruccion;
import taladro.maquina.Herramienta;
import taladro.proyecto.Proyecto;
import taladro.vista.proyecto.PintorProyecto;
import taladro.vista.proyecto.Rule;


public class EditorVistaPre extends EditorPart {
	public static String ID = "controles.interfaz.editores.vistapre";
	private Text transcript;
	private Text entry;
	int lastX = 0, lastY = 0;
	
	
	private Proyecto proyecto;
	public double zoomFactor = 1.0d; //TODO Add default zoom parameter
    private Button boton1;
    private Combo comboZoom;
    private Label etiqueta1;
    private Label etiqueta2;
    private float increment;
   // private Panel jPanel1;
    private ScrollPaneLayout jScrollPane1;
    private Viewer jViewport;
    private Rule columnView;
    private Rule rowView;
    private Canvas canvas;    
    private Image image;
    private PintorProyecto pintor;
   
    @Override
	public void doSave(IProgressMonitor monitor) {
		// TODO Auto-generated method stub

	}

	@Override
	public void doSaveAs() {
		// TODO Auto-generated method stub

	}

	@Override
	public void init(IEditorSite site, IEditorInput input)
			throws PartInitException {
		setSite(site);
		setInput(input);
		this.proyecto=((EditorVistaPreInput)input).getProyecto();
		setPartName(getArchivo());
	}

	private String getArchivo() {
		return ((EditorVistaPreInput) getEditorInput()).getName();
	}

	@Override
	public boolean isDirty() {
		// TODO Auto-generated method stub
		
		return false;
	}

	@Override
	public boolean isSaveAsAllowed() {
		// TODO Auto-generated method stub
		return false;
	}

	@Override
	public void createPartControl(Composite parent) {
		initCanvas(parent);
				
		//this.getSite().getPart().get
		//.getActionBars().setGlobalActionHandler("cncRouter.zoomIn", zoomInAction);
		//this.getEditorSite().getActionBars().setGlobalActionHandler("cncRouter.zoomIn", zoomInAction);

	//	Composite top = new Composite(parent, SWT.NONE);
		//Composite dibujo =  new Composite(parent, SWT.NONE);
		/*GridLayout layout = new GridLayout();
		layout.numColumns=4;
		layout.marginWidth = 0;
		layout.marginHeight = 0;
		top.setLayout(layout);
		etiqueta1 = new Label(top,SWT.NONE);
	    boton1 = new Button(top,SWT.NONE);
	    etiqueta1.setText("Vista Previa");*/
		//panelProyecto=new PintorProyecto(dibujo,SWT.BORDER);
		//panelProyecto.pintar(this.proyecto);
	}
	
	public void repintar(Instruccion[] inst){
		pintor.repintar(inst);
	}
	
	private void repintar_todo(){
		Vector<Herramienta> herramientas=(Vector<Herramienta>)proyecto.getHerramientas();
		for(int i=0;i<herramientas.size();i++){
			for(int j=0;j<herramientas.get(i).getInstrucciones().size();j++){
				Instruccion inst []=new Instruccion[2];
				inst[1]=herramientas.get(i).getInstrucciones().get(j);
				if(inst[1].isSeleccionada()){
					if(j>0){
						inst[0]=herramientas.get(i).getInstrucciones().get(j-1);
					}else{
						inst[0]=herramientas.get(i).getInstrucciones().get(herramientas.get(i).getInstrucciones().size()-1);
					}				
					pintor.marcar(inst);
				}
			}		
		}	
	}

	protected void initCanvas(Composite parent){
		Image originalImage = null;
		int width = 150, height = 200;
		
		canvas = new Canvas (parent, SWT.NO_BACKGROUND |
				SWT.NO_REDRAW_RESIZE | SWT.V_SCROLL | SWT.H_SCROLL);
		
		Point punto = canvas.getDisplay().getDPI();				
		increment = (((float) punto.x) / (float) 25.4); // puntos por mm //

		
		pintor = new PintorProyecto(canvas);
		System.out.println(proyecto);
		pintor.pintar(proyecto);
		pintor.setZoomFactor(zoomFactor);
		image = pintor.getImage();
		
		/*
		
		originalImage = new Image (canvas.getDisplay(), width, height);
		GC gc = new GC (originalImage);
		gc.fillRectangle (0, 0, width, height);
		gc.drawLine (0, 0, width, height);
		gc.drawLine (0, height, width, 0);
		gc.drawText ("Default Image", 10, 10);
		gc.dispose ();
		final Image image = originalImage;
		
		*/
		final Point origin = new Point (0, 0);
		
		
		
		final ScrollBar hBar = canvas.getHorizontalBar ();
		hBar.addListener (SWT.Selection, new Listener () {
			public void handleEvent (Event e) {
				int hSelection = hBar.getSelection ();
				int destX = -hSelection - origin.x;
				Rectangle rect = image.getBounds ();
				canvas.scroll (destX, 0, 0, 0, rect.width, rect.height, false);
				origin.x = -hSelection;
			}
		});
		final ScrollBar vBar = canvas.getVerticalBar ();
		vBar.addListener (SWT.Selection, new Listener () {
			public void handleEvent (Event e) {
				int vSelection = vBar.getSelection ();
				int destY = -vSelection - origin.y;
				Rectangle rect = image.getBounds ();
				canvas.scroll (0, destY, 0, 0, rect.width, rect.height, false);
				origin.y = -vSelection;
			}
		});
		canvas.addListener (SWT.Resize,  new Listener () {
			public void handleEvent (Event e) {
				onResize();
			}
		});
		canvas.addListener (SWT.Paint, new Listener () {
			public void handleEvent (Event e) {
				GC gc = e.gc;
				gc.drawImage (image, origin.x, origin.y);
				Rectangle rect = image.getBounds ();
				Rectangle client = canvas.getClientArea ();
				int marginWidth = client.width - rect.width;
				if (marginWidth > 0) {
					gc.fillRectangle (rect.width, 0, marginWidth, client.height);
				}
				int marginHeight = client.height - rect.height;
				if (marginHeight > 0) {
					gc.fillRectangle (0, rect.height, client.width, marginHeight);
				}
			}
		});

		
	}

	

	@Override
	public void setFocus() {
		// TODO Auto-generated method stub
	}
	
	public void zoomIn(){
		this.zoomFactor += .5;
		
	//	PintorProyecto pintor = new PintorProyecto(canvas);
		System.out.println(proyecto);
		pintor.setZoomFactor(zoomFactor);
		pintor.pintar(proyecto);
		repintar_todo();
		image = pintor.getImage();
		this.onResize();
	
		//canvas.update();
		//canvas.pack(true);		
	}

	
	public void zoomOut(){
		this.zoomFactor -= .5; //TODO Agregar a propiedades el zoom por defecto
		
	//	PintorProyecto pintor = new PintorProyecto(canvas);
		System.out.println(proyecto);
		pintor.setZoomFactor(zoomFactor);
		pintor.pintar(proyecto);
		repintar_todo();
		image = pintor.getImage();
		this.onResize();
	
		//canvas.update();
		//canvas.pack(true);
	}
	
	public void zoomFit(){
		Rectangle client = canvas.getClientArea ();
						
		//TODO Replace dimension (SWING) with Rectangle of SWT
		Dimension dimTablilla = new Dimension();
		proyecto.getDimProyecto(dimTablilla);
		
		double xFactor = client.width / (dimTablilla.width * increment * 1.1);
		double yFactor = client.height / (dimTablilla.height * increment * 1.1);
		
		if( yFactor < xFactor )
			this.zoomFactor = yFactor;
		else
			this.zoomFactor = xFactor;

//		PintorProyecto pintor = new PintorProyecto(canvas);
		System.out.println(proyecto);
		pintor.setZoomFactor(zoomFactor);
		pintor.pintar(proyecto);
		repintar_todo();
		image = pintor.getImage();
		this.onResize();

	}

/*	private void sendMessage() {
	    String body = entry.getText();
	    if (body.length() == 0)
	      return;
	    transcript.append(renderMessage(getArchivo(), body));
	    transcript.append("\n");
	    scrollToEnd();
	    entry.setText("");
	  }*/

	public Proyecto getProyecto() {
		return proyecto;
	}

	public void setProyecto(Proyecto proyecto) {
		this.proyecto = proyecto;
	}
	
	public void onResize(){
		Rectangle rect = image.getBounds ();
		Rectangle client = canvas.getClientArea ();
		
		final ScrollBar hBar = canvas.getHorizontalBar ();
		final ScrollBar vBar = canvas.getVerticalBar ();
		final Point origin = new Point (0, 0);
		
		hBar.setMaximum (rect.width);
		vBar.setMaximum (rect.height);
		hBar.setThumb (Math.min (rect.width, client.width));
		vBar.setThumb (Math.min (rect.height, client.height));
		int hPage = rect.width - client.width;
		int vPage = rect.height - client.height;
		int hSelection = hBar.getSelection ();
		int vSelection = vBar.getSelection ();
		if (hSelection >= hPage) {
			if (hPage <= 0) hSelection = 0;
			origin.x = -hSelection;
		}
		if (vSelection >= vPage) {
			if (vPage <= 0) vSelection = 0;
			origin.y = -vSelection;
		}
		canvas.redraw ();

	}

	public PintorProyecto getPintor() {
		return pintor;
	}

	public void setPintor(PintorProyecto pintor) {
		this.pintor = pintor;
	}

}
